from flask import get_flashed_messages, request, flash, render_template, redirect, url_for, session
from models.proyecto import metadata, Proyecto
from models.database import db_session
import sys
#import bz2
from models.proyectoManager import ProyectoManager
from models.usuarioManager import UsuarioManager
from models.rolManager import RolManager
from models.permisoManager import PermisoManager
from models.estadoFaseManager import EstadoFaseManager
from models.estadoProyectoManager import EstadoProyectoManager
from models.itemManager import ItemManager
from models.fase import Fase
from models.comite import Comite
from models.rol import Rol
itemMgr = ItemManager()
proyectoMgr = ProyectoManager()
usuarioMgr = UsuarioManager()
rolMgr = RolManager()
permisoMgr = PermisoManager()
estadoFaseMgr = EstadoFaseManager()
estadoProyectoMgr = EstadoProyectoManager()
"""
Clase que contiene los metodos relacionados con la gestion de proyectos del sistema
"""

def abmProyecto():
    """ Metodo encargado de la gestion de proyectos """
    filtro=""
    if request.method == "POST":
        filtro = request.form["filtro"]
        return paginarProyecto(1, filtro)
    if request.method == "GET":
        if request.args.getlist("filtro"):
            filtro = request.args.getlist("filtro")[0]
        if request.args.getlist("pagina"):
            return paginarProyecto(request.args.getlist("pagina")[0], filtro)
        else:
            return paginarProyecto(1, filtro)

def crearProyecto():
    """ Metodo encargado de guardar un proyecto """
    
    if request.method == "POST":
        nombre = request.form["nombre"]
        cantFases = request.form["cant_fases"]
        cantComite = request.form["cant_comite"]
        presupuesto = request.form["presupuesto"]
        idlider = request.form["idlider"]
        lider = usuarioMgr.getUsuario(idlider)          
        proyecto = Proyecto(nombre, cantFases, lider, cantComite, presupuesto)
        fases = []
        for i in xrange(0, int(cantFases)):
            fase = Fase (nombre="Fase_"+str(i+1), numero=i+1, descripcion="creada por defecto", cant_items="0",cant_lineabase="0")
            estadoFase = estadoFaseMgr.getEstadoFase(1)
            fase.estadofase = estadoFase
            fases.append(fase)
            
        comite = Comite(nombre="Comite del proyecto: " + nombre, descripcion="por defecto", cant_comite=cantComite)
        comite.usuarios = [proyecto.lider]
        estadoProyecto = estadoProyectoMgr.getEstadoProyecto(1)
        proyecto.estadoproyecto = estadoProyecto
        proyecto.fases = fases
        proyecto.comite = [comite]
        proyectoMgr.guardarProyecto(proyecto)
        rolLiders = rolMgr.getRolPorNombre("Lider")
#         permisos = [permisoMgr.getPermisoPorCodigo("30000"),permisoMgr.getPermisoPorCodigo("40000"), permisoMgr.getPermisoPorCodigo("50000"),permisoMgr.getPermisoPorCodigo("60000")]
        rol = Rol(nombre="Lider_"+nombre, descripcion="Rol de Lider del Proyecto")
#         for permiso in rolLiders.permisos:
#             permisos.append(permiso)
        rol.permisos = rolLiders.permisos
        rol.usuarios = [usuarioMgr.getUsuario(idlider)]
        rolMgr.guardarRol(rol)
        return redirect(url_for("abmProyecto", filtro = request.form["filtro"]))
    if request.method == "GET":
        usuarios= usuarioMgr.getUsuarios()
        return render_template("crearProyecto.html", proyecto = request.form, usuarios = usuarios, filtro = request.args.getlist("filtro")[0])

def modificarProyecto():
    """ Metodo encargado de modificar un proyecto """
    
    if request.method == "GET":
        idproyecto = request.args.getlist("idproyecto")[0]
        proyecto = proyectoMgr.getProyecto(idproyecto)
        usuarios= usuarioMgr.getUsuarios()
        return render_template("modificarProyecto.html", proyecto = proyecto, usuarios= usuarios, filtro = request.args.getlist("filtro")[0] )
    if request.method == "POST":
        idproyecto = request.form["idproyecto"]
        proyecto = proyectoMgr.getProyecto(idproyecto)
        proyecto.nombre = request.form["nombre"]
        proyecto.cantFases = request.form["cant_fases"]
        proyecto.cantComite = request.form["cant_comite"]
        proyecto.presupuesto = request.form["presupuesto"]
        idlider= request.form["idlider"]
        proyecto.lider = usuarioMgr.getUsuario(idlider)
        proyectoMgr.guardarProyecto(proyecto)
        mensajes = get_flashed_messages(with_categories= True)
        categoria, mensaje = mensajes[0]
        if categoria == "error":
            flash(mensaje, categoria)
        else:
            flash("Modificado exitosamente");
        return redirect(url_for("abmProyecto", filtro = request.form["filtro"]))

def eliminarProyecto():
    """ Metodo encargado de eliminar un proyecto """
    if request.method == "POST":
        idproyecto = request.form["idproyecto"]
        proyectoMgr.eliminarProyecto(idproyecto)
        flash("Proyecto eliminado exitosamente")
        return redirect(url_for("abmProyecto", filtro= request.form["filtro"]))
    if request.method == "GET":
        idproyecto = request.args.getlist("idproyecto")[0]
        proyecto = proyectoMgr.getProyecto(idproyecto)
        return render_template("eliminarProyecto.html", filtro= request.args.getlist("filtro")[0], proyecto = proyecto)

def consultarProyecto():
    """ Metodo encargado de consultar los datos de un proyecto """
    if request.method == "GET":
        idproyecto = request.args.getlist("idproyecto")[0]
        proyecto = proyectoMgr.getProyecto(idproyecto)
        return render_template("consultarProyecto.html", proyecto = proyecto, filtro = request.args.getlist("filtro")[0])
    return redirect(url_for("abmProyecto", filtro = request.form["filtro"]))

def calcularCosto():
    """ Metodo encargado de calcular los costos de un proyecto """
    if request.method == "GET":
        if session['idproyecto']:
            idproyecto = session['idproyecto']
            proyecto = proyectoMgr.getProyecto(idproyecto)
            items=itemMgr.getItemsDelProyecto(idproyecto)
            valor=0
            for item in items:
                valor = valor+item.costo
            return render_template("calcularCosto.html",items=items,valor=valor, proyecto = proyecto)
        else:
            flash(u"Seleccionar un proyecto antes de realizar la operaci\u00f3n", "error")
            return redirect(url_for("configurarProyecto", action="calcularCosto"))       
        
def calcularComplejidad():
    """ Metodo encargado de calcular la complejidad de un proyecto """
    if request.method == "GET":
        if session['idproyecto']:
            idproyecto = session['idproyecto']
            proyecto = proyectoMgr.getProyecto(idproyecto)
            items=itemMgr.getItemsDelProyecto(idproyecto)
            valor=0
            for item in items:
                valor = valor+item.complejidad
            return render_template("calcularComplejidad.html",items=items,valor=valor, proyecto = proyecto)
        else:
            flash(u"Seleccionar un proyecto antes de realizar la operaci\u00f3n", "error")
            return redirect(url_for("configurarProyecto", action="calcularComplejidad"))

def paginarProyecto(pagina, filtro):
    """Metodo encargado de la busqueda de usuarios a partir de un filtro"""
    porPagina= 5
    pagina = int(pagina)
    total = proyectoMgr.getProyectosPaginado(nombre=filtro, desde=None, hasta=None)
    if total % porPagina == 0:
        cantPaginas= total/porPagina
    else:
        resto = total % porPagina
        subtotal = (total-resto)
        cantPaginas= (subtotal/porPagina) + 1
    hasta = pagina * porPagina
    desde = hasta - porPagina
    usuarios = proyectoMgr.getProyectosPaginado(filtro, desde, hasta)
    return render_template("abmProyecto.html", lista = usuarios,\
        filtro = filtro, form=request.form, primera=1, ultima= cantPaginas, ant= pagina-1,\
        sig=pagina +1, cantPaginas = cantPaginas, pagina = pagina)
